package com.itheima.controller;

import com.alibaba.fastjson.JSON;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Method;

public class AllBaseServlet extends HttpServlet {
    //所有servlet的基础  所有的servlet都继承他


    @Override//doGet和和doPost方法都是执行这个方法
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //首先获取当前访问对象要访问的地址全部地址
        StringBuffer url = req.getRequestURL();
        //获得当前要执行的方法名  先分割访问地址
            //获得访问地址上面最后一个 / 的索引
        int index = url.lastIndexOf("/");
        //取出方法名 分割字符串 从最后一个 / 后一位开始取到最后一位就是要执行的方法名
        String method = url.substring(index + 1);
        //通过反射来调用方法
            //当前类的class类对象
        Class<? extends AllBaseServlet> thisClass = this.getClass();
        //获得当前调用的方法
        try {                                         //方法名     该方法的参数的class对象
            Method nowMethod = thisClass.getDeclaredMethod(method,HttpServletRequest.class,HttpServletResponse.class);
            //执行当前方法  传入的参数的请求和响应
            nowMethod.invoke(this,req,resp);
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

    /**
     * @param request 浏览器的请求对象
     * @param objectClass 要转换的实体类的class类对象
     * @param <T> 使用泛型
     * @return obj 返回是是同归json转化后的实体类的对象
     */
    public <T> T getJsonByStr(HttpServletRequest request, Class<T> objectClass){
        String json = null;
        try {
            //1,获取前端发来的json
            json = request.getReader().readLine();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //2.将json转化为实体类
        T obj = JSON.parseObject(json, objectClass);
        //3.将转化完成的对象返回
        return obj;
    }

    /**
     * 将实体类转化为json并发送给浏览器
     * @param obj 实体类对象
     * @param response 浏览器的响应对象
     */
    public void sendJson(Object obj, HttpServletResponse response) throws IOException {
        //1.将数据设置成json格式
        response.setContentType("application/json;charset=utf-8");
        //2.将对象转化为json
        String json = JSON.toJSONString(obj);
        //3.获取输出流
        PrintWriter out = response.getWriter();
        out.println(json);
    }













}
